/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package controllers;

/**
 *
 * @author Jorge
 */
import com.sun.org.apache.bcel.internal.generic.AALOAD;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import negocio.CabeceraValor;
import negocio.DetalleValor;
import negocio.Indicador;
import org.primefaces.model.chart.Axis;
import org.primefaces.model.chart.AxisType;
import org.primefaces.model.chart.DateAxis;
import org.primefaces.model.chart.LineChartModel;
import org.primefaces.model.chart.LineChartSeries;
 
@ManagedBean
public class GraficoIndicador implements Serializable {
 
    private LineChartModel animatedModel1;;
 
    @PostConstruct
    public void init() {    
        createAnimatedModels();
    }
 
    public LineChartModel getAnimatedModel1() {
        return animatedModel1;
    }
    public LineChartModel getAnimatedModel(Indicador indicador) 
    {
        animatedModel1 = nuevoModelo(indicador); 
        animatedModel1.setTitle("Line Chart");
        animatedModel1.setAnimate(true);
        animatedModel1.setLegendPosition("se");
        animatedModel1.setTitle("Histórico del Indicador");
        animatedModel1.setZoom(true);
        animatedModel1.getAxis(AxisType.Y).setLabel("Values");
        DateAxis axis = new DateAxis("Dates");
        axis.setTickAngle(-50);
        axis.setTickFormat("%b %#d, %y");
        axis.setMin("01-01-2015");
        animatedModel1.getAxes().put(AxisType.X, axis);         
         
        return animatedModel1;
    }  
    private void createAnimatedModels() {
        animatedModel1 = initLinearModel();
        animatedModel1.setTitle("Line Chart");
        animatedModel1.setAnimate(true);
        animatedModel1.setLegendPosition("se");
        animatedModel1.setTitle("Histórico del Indicador");
        animatedModel1.setZoom(true);
        animatedModel1.getAxis(AxisType.Y).setLabel("Values");
        DateAxis axis = new DateAxis("Dates");
        axis.setTickAngle(-50);
        axis.setTickFormat("%b %#d, %y");
        axis.setMin("01-01-2015");
        animatedModel1.getAxes().put(AxisType.X, axis);        
    }
        
    private LineChartModel initLinearModel() {
        LineChartModel model = new LineChartModel();
        
        LineChartSeries valores = new LineChartSeries();
        valores.setLabel("historial");
        valores.set("12-12-2015", 51);
        model.addSeries(valores);
        
        return model;
    }
    private LineChartModel nuevoModelo(Indicador ind) {
        
        FacesContext facesContext= FacesContext.getCurrentInstance();
        IndicadorController beanIndicador = (IndicadorController)facesContext.getApplication().createValueBinding("#{indicadorController}").getValue(facesContext);
        Indicador indicador=beanIndicador.getIndicador(ind.getIdindicador());
        CabeceraValorController beanCabeceras = (CabeceraValorController)facesContext.getApplication().createValueBinding("#{cabeceraValorController}").getValue(facesContext);
        List<CabeceraValor> cabecerasb=beanCabeceras.getItems();
        ArrayList<CabeceraValor> cabecerasind=new ArrayList();
        for(int n=0;n<cabecerasb.size();n++){
            if(indicador.getIdindicador()==cabecerasb.get(n).getIndicadorIdindicador().getIdindicador()){
                cabecerasind.add(cabecerasb.get(n));
            }
        }
        
        LineChartModel model = new LineChartModel();  
        
        LineChartSeries valores = new LineChartSeries();
        valores.setLabel("historial");
        ArrayList<CabeceraValor> cabeceras= new ArrayList<CabeceraValor>();
        cabeceras.addAll(indicador.getCabeceraValorList());
        String pattern = "MM-dd-yyyy";
        SimpleDateFormat formatter = new SimpleDateFormat(pattern);
        valores.setLabel("historial");
        cabeceras=cabecerasind;
        for(int i=0;i<cabeceras.size();i++){
            if(cabeceras.get(i).getIndicadorIdindicador().getIdindicador()==indicador.getIdindicador()){
                ArrayList<DetalleValor> detalles= new ArrayList<DetalleValor>();
                detalles.addAll(this.getDetallesByCabeceraId(cabeceras.get(i).getIdcabeceraValor()));
                if(detalles.size()==2){
                    String operacion=cabeceras.get(i).getIndicadorIdindicador().getFormulaIdformula().getOperacionIdoperacion().getNombre();
                    if(operacion.equals("Suma (+)") || operacion.equals("Suma") || operacion.equals("+") || operacion.equals("suma")){
                        valores.set(formatter.format(cabeceras.get(i).getFecha()).toString(), (detalles.get(0).getValorComponente()+detalles.get(1).getValorComponente()));
                        System.out.println(""+(detalles.get(0).getValorComponente()+detalles.get(1).getValorComponente()));
                    }else if(operacion.equals("Resta (-)") || operacion.equals("Resta") || operacion.equals("-") || operacion.equals("resta")){
                        valores.set(formatter.format(cabeceras.get(i).getFecha()).toString(), (detalles.get(0).getValorComponente()-detalles.get(1).getValorComponente()));
                    }else if(operacion.equals("Multiplicacion (*)") || operacion.equals("Multiplicacion") || operacion.equals("*") || operacion.equals("multiplicacion)")){
                        valores.set(formatter.format(cabeceras.get(i).getFecha()).toString(), (detalles.get(0).getValorComponente()*detalles.get(1).getValorComponente()));
                    }else if(operacion.equals("Division (/)") || operacion.equals("Division") || operacion.equals("/") || operacion.equals("division")){
                        valores.set(formatter.format(cabeceras.get(i).getFecha()).toString(), (detalles.get(0).getValorComponente()/detalles.get(1).getValorComponente()));
                    }      
                }
                else {
                    //valores.set(formatter.format(cabeceras.get(i).getFecha()).toString(), (detalles.get(0).getValorComponente())*100);
                }
                System.out.println(formatter.format(cabeceras.get(i).getFecha()).toString());
            }
        }
        model.addSeries(valores);
        return model;
    }    
    
    public List<DetalleValor> getDetallesByCabeceraId(Integer cabeceraid){
        FacesContext facesContext= FacesContext.getCurrentInstance();
        DetalleValorController beanDetalle = (DetalleValorController)facesContext.getApplication().createValueBinding("#{detalleValorController}").getValue(facesContext);
        List<DetalleValor> detalles=new ArrayList();
        List<DetalleValor> alldetalles=beanDetalle.getItems();
        for(int i=0;i<alldetalles.size();i++){
            if(alldetalles.get(i).getCabeceraValorIdcabeceraValor().getIdcabeceraValor()==cabeceraid){
                detalles.add(alldetalles.get(i));
            }
        }
        return detalles;
    }
}
